package exp5;

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class TextFileEditorJFrame extends JFrame implements ActionListener {
    private JTextArea textArea;
    private File file;

    public TextFileEditorJFrame(File file) {
        this.file = file;
        initUI();
    }
    private void initUI() {
        // 设置窗口标题
        setTitle("文本文件编辑器 - " + (file != null ? file.getName() : ""));
        // 设置窗口大小
        setSize(800, 600);
        // 窗口居中显示
        setLocationRelativeTo(null);
        // 设置关闭窗口时的默认操作
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        // 创建文本区域
        textArea = new JTextArea();
        // 添加滚动条
        JScrollPane scrollPane = new JScrollPane(textArea);
        // 将滚动面板添加到窗口的中心位置
        add(scrollPane, BorderLayout.CENTER);

        // 创建菜单栏
        JMenuBar menuBar = new JMenuBar();
        // 将菜单栏添加到窗口
        setJMenuBar(menuBar);

        // 创建文件菜单
        JMenu menuFile = new JMenu("文件");
        // 将文件菜单添加到菜单栏
        menuBar.add(menuFile);

        // 创建打开菜单项
        JMenuItem openItem = new JMenuItem("打开");
        // 为打开菜单项添加动作监听器
        openItem.addActionListener(this);
        // 将打开菜单项添加到文件菜单
        menuFile.add(openItem);

        // 创建保存菜单项
        JMenuItem saveItem = new JMenuItem("保存");
        // 为保存菜单项添加动作监听器
        saveItem.addActionListener(this);
        // 将保存菜单项添加到文件菜单
        menuFile.add(saveItem);

        // 创建关闭菜单项
        JMenuItem closeItem = new JMenuItem("关闭");
        // 为关闭菜单项添加动作监听器
        closeItem.addActionListener(this);
        // 将关闭菜单项添加到文件菜单
        menuFile.add(closeItem);

        Font textAreaFont = new Font("Serif", Font.PLAIN, 20); // 使用Serif字体，普通样式，大小为18
        textArea.setFont(textAreaFont);

        // 设置菜单项的字体
        Font menuItemFont = new Font("SansSerif", Font.PLAIN, 20); // 使用SansSerif字体，普通样式，大小为16
        menuFile.setFont(menuItemFont);
        openItem.setFont(menuItemFont);
        saveItem.setFont(menuItemFont);
        closeItem.setFont(menuItemFont);

        // 设置窗口可见
        setVisible(true);

        // 如果传入了文件，则尝试加载文件内容
        if (file != null && file.exists()) {
            loadFile(file);
        }
    }
//    private void initUI() {
//        setTitle("文本文件编辑器 - " + file.getName());
//        setSize(600, 400);
//        setLocationRelativeTo(null); // 窗口居中
//        setDefaultCloseOperation(DISPOSE_ON_CLOSE); // 关闭窗口时不退出程序
//
//        textArea = new JTextArea();
//        JScrollPane scrollPane = new JScrollPane(textArea);
//        add(scrollPane, BorderLayout.CENTER);
//
//        JMenuBar menuBar = new JMenuBar();
//        setJMenuBar(menuBar);
//
//        JMenu menuFile = new JMenu("文件");
//        menuBar.add(menuFile);
//
//        JMenuItem openItem = new JMenuItem("打开");
//        openItem.addActionListener(this);
//        menuFile.add(openItem);
//
//        JMenuItem saveItem = new JMenuItem("保存");
//        saveItem.addActionListener(this);
//        menuFile.add(saveItem);
//
//        JMenuItem closeItem = new JMenuItem("关闭");
//        closeItem.addActionListener(this);
//        menuFile.add(closeItem);
//
//        setVisible(true);
//
//        // 如果传入了文件，则尝试加载文件内容
//        if (file != null && file.exists()) {
//            loadFile(file);
//        }
//    }

    private void loadFile(File file) {
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
            textArea.setText(sb.toString());
        } catch (IOException e) {
            JOptionPane.showMessageDialog(this, "无法加载文件: " + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void saveFile(File file) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
            writer.write(textArea.getText());
        } catch (IOException e) {
            JOptionPane.showMessageDialog(this, "无法保存文件: " + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        switch (command) {
            case "打开":
                JFileChooser fileChooser = new JFileChooser();
                int result = fileChooser.showOpenDialog(this);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = fileChooser.getSelectedFile();
                    this.file = selectedFile;
                    loadFile(selectedFile);
                }
                break;
            case "保存":
                if (file != null) {
                    saveFile(file);
                } else {
                    JFileChooser fileChooserSave = new JFileChooser();
                    int resultSave = fileChooserSave.showSaveDialog(this);
                    if (resultSave == JFileChooser.APPROVE_OPTION) {
                        this.file = fileChooserSave.getSelectedFile();
                        saveFile(this.file);
                    }
                }
                break;
            case "关闭":
                dispose(); // 关闭当前窗口
                break;
        }
    }
}
public class FileManagerJFrame extends JFrame implements ActionListener {
    private File dir;                         //文件对象，表示指定目录
    private File[] files;                     //保存指定目录中所有文件
    private JTextField text_dir;               //地址栏，显示目录路径
    private JList list_files;          //列表框，显示指定目录中所有文件和子目录

    public FileManagerJFrame() {
        super("文件管理器");
        this.setSize(400, 300);
        this.setLocation(200, 140);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        // 设置全局字体
        Font globalFont = new Font("SansSerif", Font.PLAIN, 20); // 使用SansSerif字体，普通样式，大小为16
        UIManager.put("defaultFont", globalFont);

        this.dir = new File(".", "");           //创建表示当前目录的文件对象
        this.text_dir = new JTextField(this.dir.getAbsolutePath());
        this.text_dir.setFont(globalFont);
        //显示目录路径
        this.getContentPane().add(this.text_dir, "North");
        this.text_dir.addActionListener(this);
        this.getContentPane().setFont(globalFont);

        this.files = this.dir.listFiles();      //返回指定目录中所有文件对象
        String[] filenames = this.dir.list();   //返回指定目录中所有文件名字符串
        this.list_files = new JList(filenames); //所有文件名字符串显示在列表框中
        this.getContentPane().add(this.list_files);
        this.list_files.setFont(globalFont);

        this.addMenu(globalFont);                         //调用自定义方法，添加菜单
        this.setVisible(true);
    }

    private void addMenu(Font globalFont)                                 //添加主菜单
    {
        JMenuBar menubar = new JMenuBar();                 //菜单栏
        this.setJMenuBar(menubar);                         //框架上添加菜单栏

        JMenu menu_file = new JMenu("文件");               //菜单
        menubar.add(menu_file);                            //菜单栏中加入菜单

        JMenuItem menuitem_open = new JMenuItem("打开");   //创建菜单项
        menu_file.add(menuitem_open);                      //菜单项加入到菜单
        menuitem_open.addActionListener(this);    //为菜单项注册单击事件监听器

        JMenuItem menuitem_sendto = new JMenuItem("复制到C:\\备份");
        menu_file.add(menuitem_sendto);
        menuitem_sendto.addActionListener(this);

        JMenuItem menuitem_delete = new JMenuItem("删除");
        menu_file.add(menuitem_delete);
        menuitem_delete.addActionListener(this);

        menu_file.setFont(globalFont);
        menuitem_open.setFont(globalFont);
        menuitem_sendto.setFont(globalFont);
        menuitem_delete.setFont(globalFont);
    }

    public static void copyFile(File file, File file2)
    //复制文件，适用于任意类型文件
    {                                 //将file文件内容复制file文件中，重写方式
        try {
            FileInputStream fin = new FileInputStream(file);
            //创建文件输入流对象
            FileOutputStream fout = new FileOutputStream(file2);
            //创建文件输出流对象
            byte[] buffer = new byte[512];         //字节缓冲区
            int count = 0;
            do {
                count = fin.read(buffer);                  //读取输入流
                if (count != -1)
                    fout.write(buffer);                    //写入输出流
            } while (count != -1);
            fin.close();                                   //关闭输入流
            fout.close();                                  //关闭输出流

            file2.setLastModified(file.lastModified());
            //将新文件的最后修改时间设置为原文件的最后修改时间
        } catch (IOException ioex) {
            System.out.println("复制 " + file.getName() + " 文件未成功。");
        }
    }

    public void actionPerformed(ActionEvent e)             //单击事件处理程序
    {
        if (e.getSource() == this.text_dir)                   //单击文本行时
        {
            this.dir = new File(this.text_dir.getText());
            this.files = this.dir.listFiles();
            String[] filenames = this.dir.list();
            this.list_files.setListData(filenames); //重新设置列表框中的数据项
        }

        if (e.getActionCommand() == "打开")                   //单击菜单项时
        {
            int i = this.list_files.getSelectedIndex();
            //返回列表框第1个选中数据项的序号，从0开始；没有选中时返回-1
            if (i != -1)
                if (this.files[i].isFile()) {
                    String fname = (String) this.list_files.getSelectedValue();
                    //返回列表框第1个选中数据项的值；没有选中时返回null
                    int j = fname.indexOf('.');
                    if (j > 0) {
                        String extend = fname.substring(j + 1);
                        //获得.之后的扩展名字符串
                        if (extend.equals("txt") || extend.equals("java"))
                            new TextFileEditorJFrame(this.files[i]);
                            //打开文本文件编辑器
                        else
                            System.out.println("运行错误：不能打开这类文件。");
                    }
                } else {
                    this.dir = this.files[i];
                    this.files = this.dir.listFiles();
                    String[] filenames = this.dir.list();
                    this.list_files.setListData(filenames);
                }
        }

        if (e.getActionCommand() == "复制到C:\\备份") {
            int i = this.list_files.getSelectedIndex();
            if (i != -1 && this.files[i].isFile())      //仅复制文件，不复制目录
            {
                File dir_copyto = new File("C:\\备份", ""); //指定复制到的目录
                if (!dir_copyto.exists())                  //目录不存在时
                {
                    dir_copyto.mkdir();                    //创建目录
                    File f2 = new File(dir_copyto, this.files[i].getName());
                    this.copyFile(this.files[i], f2);      //复制文件
                } else                                       //目录存在时
                {
                    File f2 = new File(dir_copyto, this.files[i].getName());
                    if (!f2.exists())                      //文件不存在时
                        this.copyFile(this.files[i], f2);
                    else                                   //文件存在时
                        if (this.files[i].lastModified() > f2.lastModified())
                            this.copyFile(this.files[i], f2); //待复制文件日期
                    //较新时复制
                }
            }
        }
        if (e.getActionCommand() == "删除") {
            int i = this.list_files.getSelectedIndex();
            if (i != -1) {
                this.files[i].delete();                    //删除文件
                String[] filenames = this.dir.list();
                this.list_files.setListData(filenames);
            }
        }
    }

    public static void main(String arg[]) {
        new FileManagerJFrame();
    }
}